#include "dialog_camadjust.h"
#include "ui_dialog_camadjust.h"
#include <QDebug>
#include <QPushButton>
#include <QPushButton>


int Dialog_camAdjust::topCamadjustValue = 740;
int Dialog_camAdjust::sideCamadjustValue = 740;

Dialog_camAdjust::Dialog_camAdjust(QWidget *parent, Dialog_camAdjust::comboBoxItem currItem) :
    QDialog(parent),
    m_currItem(currItem),
    ui(new Ui::Dialog_camAdjust)
{
    ui->setupUi(this);

    // 设置输入框字体颜色
    ui->lineEdit_angle->setStyleSheet("color:black");
    ui->lineEdit_stepWidth->setStyleSheet("color:black");

    // 获取拖动条最小最大值，显示到标签
    ui->label_MinVal->setText(QString::number(ui->hSlider_currentAngle->minimum()));
    ui->label_MaxVal->setText(QString::number(ui->hSlider_currentAngle->maximum()));

    // 创建文本输入框（用于显示和输入数字）
//    ui->lineEdit_stepWidth->setValidator(new QIntValidator(1, ui->hSlider_currentAngle->maximum(), this));

//    QRegExp regExp("^(?:[1-9]|[1-9][0-9]|[1-6][0-9][0-9]|7[0-3][0-9]|740)$");// 限制输入范围（1~740）

    QRegExp regExp("^(?:[1-9]|[1-9][0-9]|100)$");// 限制输入范围（1~100）
    QRegExpValidator *regExpValidator = new QRegExpValidator(regExp, this);
    ui->lineEdit_stepWidth->setValidator(regExpValidator);

    // 初始化当前顶部镜头焦距拖动条
    ui->hSlider_currentAngle->setValue(topCamadjustValue);
    // 输入框和拖动条，同步对齐当前角度
    ui->lineEdit_angle->setText(QString::number(ui->hSlider_currentAngle->value()));

    connect(ui->hSlider_currentAngle, &QSlider::valueChanged, [=](int value){
        ui->lineEdit_angle->setText(QString::number(value));

        QString currentText = ui->comboBox_Lens_name->currentText();
        if(currentText == "顶部")
        {
            topCamadjustValue = ui->hSlider_currentAngle->value();
        } else if(currentText == "侧面")
        {
            sideCamadjustValue = ui->hSlider_currentAngle->value();
        }

        qDebug() << "当前：" << value << "顶部：" << topCamadjustValue << "侧面：" << sideCamadjustValue;
    });


    connect(ui->comboBox_Lens_name, &QComboBox::currentTextChanged, [=](QString currentText){
        int CamadjustValue = ui->hSlider_currentAngle->value();
//        int currentAngle = ui->hSlider_currentAngle->value();

        if(currentText == "顶部")
        {
//            topCamadjustValue = 740;
            CamadjustValue = topCamadjustValue;

        } else if(currentText == "侧面")
        {
//            sideCamadjustValue = 740;
            CamadjustValue = sideCamadjustValue;

        }
        ui->hSlider_currentAngle->setValue(CamadjustValue);

    });


    // 设置当前选项
    if(m_currItem != Null)
    {
        ui->comboBox_Lens_name->setCurrentIndex(m_currItem);
        ui->comboBox_Lens_name->setEnabled(false);
    }

    // 判断当前角度是否小于最大值，如果小于说明进行了减操作，记录到上一次调整方向（因为每次都会先初始化到740）
    int max = ui->hSlider_currentAngle->maximum();// 最大值
    int currAngle = ui->hSlider_currentAngle->value();// 当前值
    if(max > currAngle)
    {
        m_lastTimePn = false;// 记录上次操作，-减（false）
        m_lastTimePnTop = false;
        m_lastTimePnSide = false;
    }

    // 初始化定时器
    initTimer();
}


Dialog_camAdjust::~Dialog_camAdjust()
{
    disconnect(m_timer, &QTimer::timeout, this, &Dialog_camAdjust::onTimeout);

    if(m_timer != nullptr)
    {
        if(m_timer->isActive())
        {
            m_timer->stop();
        }

        delete m_timer;
    }

    delete ui;
}

void Dialog_camAdjust::initTimer()
{
    // 初始化定时器
    m_timer = new QTimer(this);
    m_timer->setSingleShot(true);// 设置定时器为单次触发

    connect(m_timer, &QTimer::timeout, this, &Dialog_camAdjust::onTimeout);
}

void Dialog_camAdjust::onTimeout()
{
    m_timer->stop();// 关闭定时器

    do_disableAngleSet(true);// 使能按键
}

void Dialog_camAdjust::waitForTime(int finishTime, int intervalTime)
{
    // 延时等待并检查 PLC 是否复位完成
    QEventLoop loop;
    QTimer timer;
    timer.setInterval(intervalTime); // 设置检查间隔，例如每秒检查一次

    connect(&timer, &QTimer::timeout, [&]()
    {
        static int count = 0;
        // 检查 PLC 是否复位完成
        if (++count >= finishTime) // 假设这是一个检查 PLC 状态的函数
        {
            loop.quit(); // 退出事件循环
        }
        qDebug() << "conut:" << count;
        count %= finishTime;
    });

    timer.start();
    loop.exec(); // 进入事件循环，等待 PLC 复位完成
}

int Dialog_camAdjust::calculateFocusRotation(int currentFocus, int targetFocus) {
    // 确保焦距在有效范围内
    currentFocus = std::max(-740, std::min(740, currentFocus));
    targetFocus = std::max(-740, std::min(740, targetFocus));

    // 计算需要旋转的值
    int rotation = targetFocus - currentFocus;

    return rotation;
}

void Dialog_camAdjust::topSetAngle(int &angle)
{
    // 判断是否是对应的操作对象
    if(ui->comboBox_Lens_name->currentText() != "顶部")
    {
        return;
    }

    // 获取当前角度（更新后）
    int currAngle = ui->hSlider_currentAngle->value();
    // 获取当前角度最大值
    int angleMax = ui->hSlider_currentAngle->maximum();
//    // 获取当前角度最小值
//    int angleMin = ui->hSlider_currentAngle->minimum();

    // 判断是否在最大
    if(angleMax != currAngle && 0 != currAngle) /* || angleMin != currAngle */
    {
        // 判断正负，记录本次调整方向
        if(angle < 0)
        {
            m_thisTimePnTop = false;
        } else {
            m_thisTimePnTop = true;
        }

        // 拿这本次调整方向跟上次调整方向对比
        if(m_thisTimePnTop != m_lastTimePnTop)
        {
            // 反向操作则在原本的基础上±55
            int value = angle;
            angle = value + 55 * (angle >= 0 ? 1 : -1);
//            ui->hSlider_currentAngle->setValue((currAngle-value) + angle);// 更新显示
        }
    }
    // 记录上次调整方向
    m_lastTimePnTop = m_thisTimePnTop;

//    // 发送指令设置焦距
//    this->SetAngle(angle);
}

void Dialog_camAdjust::sideSetAngle(int &angle)
{
    // 判断是否是对应的操作对象
    if(ui->comboBox_Lens_name->currentText() != "侧面")
    {
        return;
    }

    // 获取当前角度（更新后）
    int currAngle = ui->hSlider_currentAngle->value();
    // 获取当前角度最大值
    int angleMax = ui->hSlider_currentAngle->maximum();
//    // 获取当前角度最小值
//    int angleMin = ui->hSlider_currentAngle->minimum();

    // 判断是否在最大
    if(angleMax != currAngle && 0 != currAngle) /* || angleMin != currAngle */
    {
        // 判断正负，记录本次调整方向
        if(angle < 0)
        {
            m_thisTimePnSide = false;
        } else {
            m_thisTimePnSide = true;
        }

        // 拿这本次调整方向跟上次调整方向对比
        if(m_thisTimePnSide != m_lastTimePnSide)
        {
            // 反向操作则在原本的基础上±55
            int value = angle;
            angle = value + 55 * (angle >= 0 ? 1 : -1);
//            ui->hSlider_currentAngle->setValue((currAngle-value) + angle);// 更新显示
        }
    }
    // 记录上次调整方向
    m_lastTimePnSide = m_thisTimePnSide;

//    // 发送指令设置焦距
//    this->SetAngle(angle);
}


void Dialog_camAdjust::SetAngle(int angle)
{
//    // 根据当前操作对象，调整偏差
//    if(ui->comboBox_Lens_name->currentText() == "侧面")
//    {
//        sideSetAngle(angle);// 调整侧面偏差
//    } else {
//        topSetAngle(angle);// 调整顶部偏差
//    }

    // 生成数据帧
    QByteArray dat = formSetData(m_speed, angle, m_radio);

    // 调用对应的端口发送函数
    if(ui->comboBox_Lens_name->currentText() == "侧面")
    {
        emit sendSideAdjustData(dat);// 侧面
    } else {
        emit sendTopAdjustData(dat);// 顶部
    }

    // 记录上次调整方向
    m_lastTimePn = m_thisTimePn;

    int delayTime = 1000; // 固定1秒  // angle / 100 * 1000;// 每次操作步长越大，延时越长

    do_disableAngleSet(false);// 禁用按键
    m_timer->start(delayTime);// 开启定时器，射线回调使能按键函数
}


void Dialog_camAdjust::getTopRecv(QByteArray data)
{
    QString dat_str = "Top 镜头->返回 Data(HEX):";

    for(int i = 0; i < data.size(); ++i)
    {
        dat_str += QString("%1 ").arg(data.at(i), 2, 16, QChar('0')).toUpper();
    }

//    // 判断响应是否到位置
//    if(ui->comboBox_Lens_name->currentText() == "顶部")
//    {
//        do_disableAngleSet(true);
//    }
}

void Dialog_camAdjust::getSideRecv(QByteArray data)
{
    QString dat_str = "Side 镜头->返回 Data(HEX):";

    for(int i = 0; i < data.size(); ++i)
    {
        dat_str += QString("%1 ").arg(data.at(i), 2, 16, QChar('0')).toUpper();
    }

//    // 判断响应是否到位置
//    if(ui->comboBox_Lens_name->currentText() == "侧面")
//    {
//        do_disableAngleSet(true);
//    }

}


QByteArray Dialog_camAdjust::formSetData(int speed,int angle,int radio)
{
    QByteArray dat;
    dat.append(0x01);
    dat.append(0x64);
    dat.append(0x01);
    int temp = speed * radio / 6000;
    dat+=intToByteArray(temp);
    temp = angle * radio / 360;
    dat+=intToByteArray(temp);

    dat.append('\x00');
    dat.append('\x00');
    dat.append('\x00');
    return dat;
}

QByteArray Dialog_camAdjust::intToByteArray(int value)
{
    QByteArray byteArray;
    byteArray.resize(4);

    byteArray[0] = (uint8_t)(value >> 24) & 0xFF;
    byteArray[1] = (uint8_t)(value >> 16) & 0xFF;
    byteArray[2] = (uint8_t)(value >> 8) & 0xFF;
    byteArray[3] = (uint8_t) value & 0xFF;

    return byteArray;
}

void Dialog_camAdjust::on_btn_ok_clicked()
{
    emit returnData(ui->hSlider_currentAngle->value());

    accept();
}

void Dialog_camAdjust::on_btn_cancel_clicked()
{
    reject();
}

void Dialog_camAdjust::do_disableAngleSet(bool state)
{


    ui->lineEdit_stepWidth->setEnabled(state);
    ui->btn_angle_add->setEnabled(state);
    ui->btn_angle_subtract->setEnabled(state);
}

// 角度-
void Dialog_camAdjust::on_btn_angle_subtract_clicked()
{
    // 获取本次需要调整的值（步长）
    int Angle = ui->lineEdit_stepWidth->text().toUInt();

    m_angle = -Angle;
    // 获取当前角度
    int currentAngle = ui->hSlider_currentAngle->value();
    // 设置调整后的角度
    ui->hSlider_currentAngle->setValue(currentAngle + m_angle);
    // 发送指令设置角度
    this->SetAngle(m_angle);
}

// 角度+
void Dialog_camAdjust::on_btn_angle_add_clicked()
{
    // 获取本次需要调整的值（步长）
    int Angle = ui->lineEdit_stepWidth->text().toUInt();

    m_angle = Angle;
    // 获取当前角度
    int currentAngle = ui->hSlider_currentAngle->value();
    // 设置调整后的角度
    ui->hSlider_currentAngle->setValue(currentAngle + m_angle);
    // 发送指令设置角度
    this->SetAngle(m_angle);
}

void Dialog_camAdjust::mousePressEvent(QMouseEvent *event)
{
    // 调用基类的 mousePressEvent 以保持默认行为（如果需要）
    QDialog::mousePressEvent(event);
}

//void Dialog_camAdjust::on_pushButton_clicked()
//{
//    if(ui->comboBox_Lens_name->currentText() == "侧面")
//    {
//        topCamadjustValue = 740;
//    } else {
//        topCamadjustValue = 740;
//    }
//    ui->hSlider_currentAngle->value(740);
//    SetAngle(1480);
//}



//void Dialog_camAdjust::on_lineEdit_stepWidth_textChanged(const QString &arg1)
//{
//    static QString lastText;
//    bool ok;
//    QString text = arg1.trimmed();
//    int val = text.toFloat(&ok) * 1;

//    if(false == ok)
//    {
//        qDebug() << QString("输入 %1 无效，恢复到上一次的有效值 %2").arg(arg1.toInt()).arg(lastText);
//        // 输入无效，恢复到上一次的有效值
//        ui->lineEdit_stepWidth->setText(lastText);
//        return;
//    }


//    // 取值范围（1~100）
//    if(val < 1)
//    {
//        val = 1;
//    } else if(val > 100) {
//        val = 100;
//    }

//    lastText = QString(val);

//    ui->lineEdit_stepWidth->setText(QString(val));
//}
